// 自己选择的路，跪着也要走完。朋友们，虽然这个世界日益浮躁起来,只
// 要能够为了当时纯粹的梦想和感动坚持努力下去，不管其它人怎么样,我
// 们也能够保持自己的本色走下去。                      ——AKPower
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <vector>
#include <map>
#include <queue>
#include <cstdio>
#include <string>
#include <stack>
#include <set>
#define IOS ios::sync_with_stdio(false), cin.tie(0)
using namespace std;
typedef long long ll;
ll tree[50]={0};
ll a[25],n;
ll ans[25];
void dfs(ll id,ll num){
    if(tree[id]==0){
        tree[id]=num;
        return;
    }
    if(tree[id]<num){
        dfs(id*2,num);
    }
    else dfs(id*2+1,num);
    return ;
}
queue<ll> q;

int main()
{
    IOS;
    cin>>n;
    for(ll i=0;i<n;i++){
        cin>>a[i];
    }
    tree[1]=a[0];
    for(ll i=1;i<n;i++){
        dfs(1,a[i]);
    }
    ll cnt=0;
    q.push(1);
    bool flag=true;
    while(!q.empty()){
        ll id=q.front();
        ans[cnt++]=tree[id];
        q.pop();
        ll J=0;
        if(tree[id*2]>0){q.push(id*2);J++;}
        if(tree[id*2+1]>0){q.push(id*2+1);J++;}
        if(J&1){
            flag=false;
        }
    }
    cout<<ans[0];
    for(ll i=1;i<cnt;i++){
        cout<<" "<<ans[i];
    }
    cout<<endl;
    if(flag)cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
    getchar();
    getchar();
    return 0;
}
